home *** CD-ROM | disk | FTP | other *** search
/ Freelog 125 / Freelog_MarsAvril2015_No125.iso / Musique / Quod Libet / quodlibet-3.3.0-installer.exe / bin / multiprocessing / heap.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2014-12-31  |  7KB  |  219 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.7)
  3.  
  4. import bisect
  5. import mmap
  6. import tempfile
  7. import os
  8. import sys
  9. import threading
  10. import itertools
  11. import _multiprocessing
  12. from multiprocessing.util import Finalize, info
  13. from multiprocessing.forking import assert_spawning
  14. __all__ = [
  15.     'BufferWrapper']
  16. if sys.platform == 'win32':
  17.     from _multiprocessing import win32
  18.     
  19.     class Arena(object):
  20.         _counter = itertools.count()
  21.         
  22.         def __init__(self, size):
  23.             self.size = size
  24.             self.name = 'pym-%d-%d' % (os.getpid(), Arena._counter.next())
  25.             self.buffer = mmap.mmap(-1, self.size, tagname = self.name)
  26.             if not win32.GetLastError() == 0:
  27.                 raise AssertionError('tagname already in use')
  28.             self._state = (None.size, self.name)
  29.  
  30.         
  31.         def __getstate__(self):
  32.             assert_spawning(self)
  33.             return self._state
  34.  
  35.         
  36.         def __setstate__(self, state):
  37.             (self.size, self.name) = self._state = state
  38.             self.buffer = mmap.mmap(-1, self.size, tagname = self.name)
  39.             if not win32.GetLastError() == win32.ERROR_ALREADY_EXISTS:
  40.                 raise AssertionError
  41.  
  42.  
  43. else:
  44.     
  45.     class Arena(object):
  46.         
  47.         def __init__(self, size):
  48.             self.buffer = mmap.mmap(-1, size)
  49.             self.size = size
  50.             self.name = None
  51.  
  52.  
  53.  
  54. class Heap(object):
  55.     _alignment = 8
  56.     
  57.     def __init__(self, size = mmap.PAGESIZE):
  58.         self._lastpid = os.getpid()
  59.         self._lock = threading.Lock()
  60.         self._size = size
  61.         self._lengths = []
  62.         self._len_to_seq = { }
  63.         self._start_to_block = { }
  64.         self._stop_to_block = { }
  65.         self._allocated_blocks = set()
  66.         self._arenas = []
  67.         self._pending_free_blocks = []
  68.  
  69.     
  70.     def _roundup(n, alignment):
  71.         mask = alignment - 1
  72.         return n + mask & ~mask
  73.  
  74.     _roundup = staticmethod(_roundup)
  75.     
  76.     def _malloc(self, size):
  77.         i = bisect.bisect_left(self._lengths, size)
  78.         if i == len(self._lengths):
  79.             length = self._roundup(max(self._size, size), mmap.PAGESIZE)
  80.             self._size *= 2
  81.             info('allocating a new mmap of length %d', length)
  82.             arena = Arena(length)
  83.             self._arenas.append(arena)
  84.             return (arena, 0, length)
  85.         length = None._lengths[i]
  86.         seq = self._len_to_seq[length]
  87.         block = seq.pop()
  88.         if not seq:
  89.             del self._len_to_seq[length]
  90.             del self._lengths[i]
  91.         (arena, start, stop) = block
  92.         del self._start_to_block[(arena, start)]
  93.         del self._stop_to_block[(arena, stop)]
  94.         return block
  95.  
  96.     
  97.     def _free(self, block):
  98.         (arena, start, stop) = block
  99.         
  100.         try:
  101.             prev_block = self._stop_to_block[(arena, start)]
  102.         except KeyError:
  103.             pass
  104.  
  105.         (start, _) = self._absorb(prev_block)
  106.         
  107.         try:
  108.             next_block = self._start_to_block[(arena, stop)]
  109.         except KeyError:
  110.             pass
  111.  
  112.         (_, stop) = self._absorb(next_block)
  113.         block = (arena, start, stop)
  114.         length = stop - start
  115.         
  116.         try:
  117.             self._len_to_seq[length].append(block)
  118.         except KeyError:
  119.             self._len_to_seq[length] = [
  120.                 block]
  121.             bisect.insort(self._lengths, length)
  122.  
  123.         self._start_to_block[(arena, start)] = block
  124.         self._stop_to_block[(arena, stop)] = block
  125.  
  126.     
  127.     def _absorb(self, block):
  128.         (arena, start, stop) = block
  129.         del self._start_to_block[(arena, start)]
  130.         del self._stop_to_block[(arena, stop)]
  131.         length = stop - start
  132.         seq = self._len_to_seq[length]
  133.         seq.remove(block)
  134.         if not seq:
  135.             del self._len_to_seq[length]
  136.             self._lengths.remove(length)
  137.         return (start, stop)
  138.  
  139.     
  140.     def _free_pending_blocks(self):
  141.         while True:
  142.             
  143.             try:
  144.                 block = self._pending_free_blocks.pop()
  145.             except IndexError:
  146.                 break
  147.  
  148.             self._allocated_blocks.remove(block)
  149.             self._free(block)
  150.  
  151.     
  152.     def free(self, block):
  153.         if not os.getpid() == self._lastpid:
  154.             raise AssertionError
  155.         if not None._lock.acquire(False):
  156.             self._pending_free_blocks.append(block)
  157.         else:
  158.             
  159.             try:
  160.                 self._free_pending_blocks()
  161.                 self._allocated_blocks.remove(block)
  162.                 self._free(block)
  163.             finally:
  164.                 self._lock.release()
  165.  
  166.  
  167.     
  168.     def malloc(self, size):
  169.         if size <= size:
  170.             pass
  171.         elif not size < sys.maxint:
  172.             raise AssertionError
  173.         if os.getpid() != self._lastpid:
  174.             self.__init__()
  175.         self._lock.acquire()
  176.         self._free_pending_blocks()
  177.         
  178.         try:
  179.             size = self._roundup(max(size, 1), self._alignment)
  180.             (arena, start, stop) = self._malloc(size)
  181.             new_stop = start + size
  182.             if new_stop < stop:
  183.                 self._free((arena, new_stop, stop))
  184.             block = (arena, start, new_stop)
  185.             self._allocated_blocks.add(block)
  186.             return block
  187.         finally:
  188.             self._lock.release()
  189.  
  190.  
  191.  
  192.  
  193. class BufferWrapper(object):
  194.     _heap = Heap()
  195.     
  196.     def __init__(self, size):
  197.         if size <= size:
  198.             pass
  199.         elif not size < sys.maxint:
  200.             raise AssertionError
  201.         block = BufferWrapper._heap.malloc(size)
  202.         self._state = (block, size)
  203.         Finalize(self, BufferWrapper._heap.free, args = (block,))
  204.  
  205.     
  206.     def get_address(self):
  207.         (arena, start, stop) = ()
  208.         size = self._state
  209.         (address, length) = _multiprocessing.address_of_buffer(arena.buffer)
  210.         if not size <= length:
  211.             raise AssertionError
  212.         return None + start
  213.  
  214.     
  215.     def get_size(self):
  216.         return self._state[1]
  217.  
  218.  
  219.